﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace xycn.pluginsupport.ControllerPlugins
{
    //定义Http请求方法处理方式的枚举，同下方属性定义相对应
    public enum HttpMethodType { POST, DELETE, PUT, GET }

    # region ===== 用于标记类具有Controller属性=====
    /// <summary>
    /// Controller实体类标记属性，使用该属性标记的类，指明该类会自动加入到框架中，处理HTTP请求
    /// </summary>
    [AttributeUsage(AttributeTargets.Class, Inherited = true, AllowMultiple = false)]
    public class ApiController : System.Attribute
    {
        /// <summary>
        /// 用于标记类为APIController，框架自动根据该类类名生成路由
        /// </summary>
        public ApiController() { }
    }
    #endregion

    # region ===== 用于标记类具有Route属性=====
    /// <summary>
    /// Controller实体类及类成员函数的路由设置属性
    /// 路由格式同标准Asp.net core含义及格式均保持一致，如/[controller]/{id}/{other}。
    /// 上述路由如果作为请求处理函数的路由的标记时，会由框架自动将id、other提取出来，
    /// 转化为函数的输入参数，该函数需要定义为"xxxx(int id, string other)", 
    /// 其中xxxx为定义的函数名，该函数id、other则需要同路由中的对应变量同名，
    /// 框架会根据该函数输入参数的类型，进行自动转换，来调用函数
    /// </summary>
    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true)]
    public class Route : System.Attribute
    {
        private string _mapRoute = "";
        /// <summary>
        /// 使用形如[controller]/{id}的模板，定义访问路由
        /// </summary>
        public string mapRoute { get { return _mapRoute; } set { _mapRoute = value.Trim(); } }

        /// <summary>
        /// 路由执行的顺序
        /// </summary>
        public int routeOrder = 0;

        /// <summary>
        /// 标记某个类的路由特性
        /// </summary>
        /// <param name="arg"></param>
        public Route(string arg) // 定位参数
        {
            mapRoute = arg;
        }
    }
    #endregion

    #region ===== 用于标记Controller类处理Http请求的成员函数=====
    /// <summary>
    /// 针对类中成员函数的属性，用于标记该类处理 HTTP 请求的函数，本属性标记方法为：
    /// [HttpMethod(HttpMethodType)]或[HttpMethod(HttpMethodType, route)]
    /// 其中HttpMethodType为枚举，定义处理函数对应的HTTP请求方法，包括 POST, DELETE, PUT, GET
    /// route为字符串，显示定义处理函数的路由，路由格式同标准Asp.net core含义及格式均保持一致，如/[controller]/{id}/{other}
    /// 函数被标记为本属性后，会由框架根据路由自动调用该函数，并根据路由信息自动向该函数传递参数。
    /// 以上述路由为例，框架自动将id、other提取出来，转化为函数的输入参数，该函数需要定义为"xxxx(int id, string other)", 
    /// 其中xxxx为定义的函数名，该函数id、other则需要同路由中的对应变量同名
    /// 注：该属性仅有一个生效，如某个函数存在多个该属性，则仅有一个生效
    /// </summary>
    [AttributeUsage(AttributeTargets.Method)]
    public class HttpMethod : System.Attribute
    {
        /// <summary>
        /// 路由执行的顺序
        /// </summary>
        public int routeOrder = 0;

        /// <summary>
        /// 定义Http请求类型
        /// </summary>
        public HttpMethodType methodType = new HttpMethodType();

        private string _mapRoute = "";
        /// <summary>
        /// 使用形如[controller]/{id}的模板，定义访问路由
        /// </summary>
        public string mapRoute { get { return _mapRoute; } set { _mapRoute = value.Trim(); } }

        /// <summary>
        /// 标记为Controller默认的GET请求处理方法
        /// </summary>
        public HttpMethod(HttpMethodType method_type)
        {
            methodType = method_type;
        }

        /// <summary>
        /// 标记为映射到指定路由的GET请求处理方法
        /// </summary>
        public HttpMethod(HttpMethodType method_type, string map_route)
        {
            methodType = method_type;
            mapRoute = map_route;
        }
    }

    /// <summary>针对类中成员函数的属性，用于标记该类处理 HTTP 请求的函数，本属性标记方法为：
    /// [HttpMethodContext(HttpMethodType)]或[HttpMethodContext(HttpMethodType, route)]
    /// 其中HttpMethodType为枚举，定义处理函数对应的HTTP请求方法，包括 POST, DELETE, PUT, GET
    /// route为字符串，显示定义处理函数的路由，路由格式同标准Asp.net core含义及格式均保持一致，如/[controller]/{id}/{other}
    /// 函数被标记为本属性后，会由框架根据路由自动调用该函数，并根据路由信息自动向该函数传递参数。
    /// 注：
    /// 1.适应该属性的函数，其输入参数固定为一个HttpContext类型，返回值固定为Task
    /// 2.该属性仅有一个生效，如某个函数存在多个该属性，则仅有一个生效
    /// </summary>
    [AttributeUsage(AttributeTargets.Method)]
    public class HttpMethodWithContext : System.Attribute
    {
        /// <summary>
        /// 路由执行的顺序
        /// </summary>
        public int routeOrder = 0;

        /// <summary>
        /// 定义Http请求类型
        /// </summary>
        public HttpMethodType methodType = new HttpMethodType();

        private string _mapRoute = "";
        /// <summary>
        /// 使用形如[controller]/{id}的模板，定义访问路由
        /// </summary>
        public string mapRoute { get { return _mapRoute; } set { _mapRoute = value.Trim(); } }

        /// <summary>
        /// 标记为映射到指定rute的GET请求处理方法
        /// </summary>
        public HttpMethodWithContext(HttpMethodType method_type)
        {
            methodType = method_type;
        }

        /// <summary>
        /// 标记为映射到指定rute的GET请求处理方法
        /// </summary>
        public HttpMethodWithContext(HttpMethodType method_type, string map_route)
        {
            methodType = method_type;
            mapRoute = map_route;
        }
    }

    /// <summary>
    /// 针对类中成员函数的属性，默认将函数标记为处理HTTP POST请求。
    /// 具有[Action]标记的函数，如果没有特别指定路由如使用[Action("xxxxxx")]
    /// 或使用Route进行标记，则以"[controller]/函数名"作该方法的路由
    /// </summary>    
    [AttributeUsage(AttributeTargets.Method)]
    public class ActionMethod : System.Attribute
    {
        /// <summary>
        /// 路由执行的顺序
        /// </summary>
        public int routeOrder = 0;

        private string _mapRoute = "";
        /// <summary>
        /// 使用形如[controller]/{id}的模板，定义访问路由
        /// </summary>
        public string mapRoute { get { return _mapRoute; } set { _mapRoute = value.Trim(); } }

        /// <summary>
        /// 标记为Controller默认的GET请求处理方法
        /// </summary>
        public ActionMethod(){ }

        /// <summary>
        /// 标记为映射到指定路由的GET请求处理方法
        /// </summary>
        public ActionMethod(string map_route){ mapRoute = map_route; }
    }

    /// <summary>
    /// 针对类中成员函数的属性，默认将函数标记为处理HTTP POST请求。
    /// 具有[Action]标记的函数，如果没有特别指定路由如使用[Action("xxxxxx")]
    /// 或使用Route进行标记，则以"[controller]/函数名"作该方法的路由
    /// 注：
    /// 1.适应该属性的函数，其输入参数固定为一个HttpContext类型，返回值固定为Task
    /// 2.该属性仅有一个生效，如某个函数存在多个该属性，则仅有一个生效
    /// </summary>    
    [AttributeUsage(AttributeTargets.Method)]
    public class ActionWithContext : System.Attribute
    {
        /// <summary>
        /// 路由执行的顺序
        /// </summary>
        public int routeOrder = 0;

        private string _mapRoute = "";
        /// <summary>
        /// 使用形如[controller]/{id}的模板，定义访问路由
        /// </summary>
        public string mapRoute { get { return _mapRoute; } set { _mapRoute = value.Trim(); } }

        /// <summary>
        /// 标记为Controller默认的GET请求处理方法
        /// </summary>
        public ActionWithContext() { }

        /// <summary>
        /// 标记为映射到指定路由的GET请求处理方法
        /// </summary>
        public ActionWithContext(string map_route) { mapRoute = map_route; }
    }
    #endregion

    #region ===== 用于标记Controller类处理函数输入参数的来源=====
    /// <summary>
    /// 定义请求处理函数的输入参数取值为请求中的query字符串即"?"后面的对应字段（与参数同名）的值
    /// </summary>
    [AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false)]
    public class FromQuery : System.Attribute { }

    /// <summary>
    /// 定义请求处理函数的输入参数取值为Form中的对应字段（与参数同名）的值
    /// </summary>
    [AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false)]
    public class FromForm : System.Attribute { }

    /// <summary>
    /// 定义请求处理函数的输入参数，该参数必须同请求体重Body反序列化后的对象一致
    /// 注意：用此属性标记参数时，一个函数中仅能有一个参数用此属性进行标记
    /// </summary>
    [AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false)]
    public class FromBody : System.Attribute { }

    /// <summary>
    /// 定义请求处理函数的输入参数取值为Http Header中的对应字段（与参数同名）的值
    /// </summary>
    [AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false)]
    public class FromHeader : System.Attribute { }

    /// <summary>
    /// 定义请求处理函数的输入参数取值为Route中的对应字段（与参数同名）的值
    /// </summary>
    [AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false)]
    public class FromRoute : System.Attribute { }

    /*/// <summary>
    /// 
    /// </summary>
    [AttributeUsage(AttributeTargets.Parameter)]
    public class FromServices : System.Attribute { }*/
    #endregion
}
